﻿#ifndef PST_FarFieldDataGenerator_H
#define PST_FarFieldDataGenerator_H

#include <QObject>
#include <QHash>
#include <QList>
#include <vtkSmartPointer.h>

class vtkTable;
class vtkStructuredGrid;
class vtkPointSet;
class vtkPolyData;

namespace pst
{
    class FarFieldDataGenerator : public QObject
    {
        Q_OBJECT

    public:
        FarFieldDataGenerator(QObject* parent = nullptr);
        ~FarFieldDataGenerator();

    public:
        void setInputData(vtkTable* table);

        //解析数据
        bool parseData(QString& errorInfo);

        QList<double> getFreqencyList();
        QList<QString> getValueNameList();
        //不传valueName默认使用第一个value列
        bool getDataSetByFreqency(int freIndex, bool isLog, bool isNormalize,
            vtkPolyData* returnPointData, int valueIndex, QString& erorrMessage, vtkSmartPointer<vtkTable>& returnTable);

        void computeTableExtends(vtkTable* table);

        // json中的文件类型result_type
        void setFileDealType(int type);

        int getFileDealType();

        ///**
        // * 设置取对数时的因子，默认10
        // * @para factory 因子
        // */
        //void SetLogCoefficients(double factory);
    private:
        /// @brief 从表格中提取theta参数(球坐标r,theta, phi)
        /// @param table 球坐标表格 (r,theta, phi)
        /// @param numVec 结果
        /// @return 是否成功
        //bool ExtractPhiNum(vtkTable* table, std::vector<double>& numVec);

        /// @brief 将多行多列的球坐标表格转为四列的直角坐标表格
        /// @param inputTable 多行多列的球坐标表格
        /// @param outputTable 四列的直角坐标表格
        /// @return 是否成功
        bool transformRCSTableToFourColumnsRectangularTable(
            vtkTable* inputTable, vtkTable* outputTable, double corlorOffset, int valueIndex);

        /// @brief 将表格转为StructuredGrid(表面重建)
        /// @param inputTable 输入的4列直角坐标表格
        /// @param outStructuredGrid 表面重建后的数据
        void transformTableToStructuredGrid(vtkTable* inputTable,
            vtkPolyData* outStructuredGrid, int xMax, int yMax, int zMax);

        /// @brief 对表格取对数
        /// @param inputTable 输入表格(多行多列的球坐标表格)
        /// @param outputTable 输出表格(多行多列的球坐标取对数后的表格，只对r取对数)
        void logTheTable(vtkTable* inputTable, vtkTable* outputTable, double& logedMinimalValue, int valueIndex);

        /// 只对valueIndex列进行 
        void normalizeTheTable(vtkTable* inputTable, vtkTable* outputTable, int valueIndex);

        void SplitVTKTable(vtkSmartPointer<vtkTable> inputTable);
        bool parseTitleName(vtkTable* inputTable, QList<QHash<int, QString>*>& returnList, QString& errorMessage);

        //特别需求，对Theta做90度偏移
        void doThetaBias();

        void decideLogCoefficients();
    private:
        //bool m_useLog;
        //bool m_useNormalize;
        double m_logFactory;
        vtkSmartPointer<vtkTable> m_originalTable;
        //vtkSmartPointer<vtkTable> m_resultTable;
        //vtkSmartPointer<vtkStructuredGrid> m_resultDataSet;
        double m_tableExtends[3];
        //int m_originalTableRowNumber;
        //int m_originalTableColNumber;
        //QList<double> m_freqencyList;
        //double m_currentFreqency;
        QString m_errorInfo;
        QHash<double, vtkSmartPointer<vtkTable>> m_devidedFreqencyTable;//按频率好的表

        QHash<int, QString> m_eachColNameOfKey;                                 // 列id,每一Key列的列名字
        QHash<int, QString> m_eachColUnitOfKey;                                 // 列id,每一Key列的单位

        QHash<int, QString> m_eachColNameOfValue;                               // 列id,每一value列的列名字
        QHash<int, QString> m_eachColUnitOfValue;                               // 列id,每一value列的单位

        QList<double> m_freList;
        QList<QString> m_nameOfKeyList;
        QList<QString> m_nameOfvalueList;

        // json中的文件类型result_type
        // 是文件的类型
        // 体电场分布（0）面电场分布（1） 点电场（探针点）（2） 表面场分布（3）表面电流密度（4） 空间电势分布（5）
        // 表面电势分布（6） 方向图（7）  S参数（8）  驻波比（9）  电压（10）
        // 电流（11） 附着点路径（14）   面电势分布（15） 干扰关联矩阵（12）  SAR（13）
        int m_fileDealType;
    };
}
#endif // FarFieldDataGenerator
